﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Red5.Frame.Utility.DataBase.RedData
{
    public interface IRedData
    {
        /// <summary>
        /// 获取指定键的值。
        /// </summary>
        /// <param name="key">键。</param>
        /// <returns>对应的值，如果未找到则返回空字符串。</returns>
        string Get(string key);

        /// <summary>
        /// 设置键值对。
        /// </summary>
        /// <param name="inKey">键。</param>
        /// <param name="inValue">值。</param>
        /// <returns>成功设置的标志。</returns>
        int Set(string inKey, string inValue);

        /// <summary>
        /// 删除指定键的值。
        /// </summary>
        /// <param name="key">键。</param>
        /// <returns>删除成功的标志。</returns>
        int Del(string key);

        /// <summary>
        /// 对指定键的数值进行增加。
        /// </summary>
        /// <param name="key">键。</param>
        /// <param name="amount">增加的数量，默认为 1。</param>
        /// <returns>增加后的值。</returns>
        long Inc(string key, long amount = 1L);

        /// <summary>
        /// 对指定键的数值进行减少。
        /// </summary>
        /// <param name="key">键。</param>
        /// <param name="amount">减少的数量，默认为 1。</param>
        /// <returns>减少后的值；如果键不存在，则返回负数（表示递减失败）。</returns>
        long Dec(string key, long amount = 1L);

        /// <summary>
        /// 异步保存数据。
        /// </summary>
        /// <returns>异步任务。</returns>
        void Save();

        /// <summary>
        /// 获取设置数据的计数器值。
        /// </summary>
        long GetSetCount { get; }

        /// <summary>
        /// 获取自运行以来的总秒数。
        /// </summary>
        double GetRunTime { get; }

        /// <summary>
        /// 获取写操作的状态信号量。
        /// </summary>
        SemaphoreSlim GetWriteState { get; }
    }
}
